uvolnenie pamati TStrings.objects

Otázka od: Lubos Urban

11. 10. 2002 8:53

Ahojte

Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu

function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
     ItemData: TItemData;
begin
  Index:= self.Items.Add(ItemText);
  ItemData:= TItemData.Create;
  ItemData.idkey:= idKey;
  ItemData.idValue:= idValue;
  ItemData.txValue:= txValue;
  Items.Objects[Index]:= ItemData;
  Result:= Index;
end;

ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;

Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky objekty
ktore sa pri volani metody AddItem vytvorili.

destructor TExComboBox.Destroy;
begin
  for i:= 0 to self.Items.Count - 1 do
     Items.Objects[Index].Free;
  inherited Destroy;
end;

padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
Akym sposobom sa potom da uvolnit naalokovana pamat ktoru zaberaju objekty asociovane s jednotlivymi polozkami ComboBoxu ???
Poradte niekto, prosim,,,,

Odpovedá: Petr Brant

11. 10. 2002 10:39

Nevim to sice jiste, ale mozna, ze je na to uz pozde, i kdyz nevim, z jakych
duvodu. Zkus to upravit tak, aby se to uvolnilo jeste pred volanim
destruktoru, jestli by to pomohlo a pak se uvidi.

RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

Subject: uvolnenie pamati TStrings.objects



Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu

function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
     ItemData: TItemData;
begin
  Index:= self.Items.Add(ItemText);
  ItemData:= TItemData.Create;
  ItemData.idkey:= idKey;
  ItemData.idValue:= idValue;
  ItemData.txValue:= txValue;
  Items.Objects[Index]:= ItemData;
  Result:= Index;
end;

ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;

Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
objekty ktore sa pri volani metody AddItem vytvorili.

destructor TExComboBox.Destroy;
begin
  for i:= 0 to self.Items.Count - 1 do
     Items.Objects[Index].Free;
  inherited Destroy;
end;

padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"

Odpovedá: Lubos Urban

11. 10. 2002 11:44

No skusim som to urobit na message WM_DESTROY ktory sa obsluzi skorej ako sa
zavola destruktor, ale nie som si isty ci je to spravne, ak by ste niekto
vedeli ako to spravit inak takporadte  

dakujem

----- Original Message -----
From: "Petr Brant" <brant@dcomm.cz>
To: <delphi-l@clexpert.cz>
Sent: Friday, October 11, 2002 10:37 AM
Subject: RE: uvolnenie pamati TStrings.objects


Nevim to sice jiste, ale mozna, ze je na to uz pozde, i kdyz nevim, z jakych
duvodu. Zkus to upravit tak, aby se to uvolnilo jeste pred volanim
destruktoru, jestli by to pomohlo a pak se uvidi.

RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

Subject: uvolnenie pamati TStrings.objects



Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
pricom som nadefinoval vlastnu metodu

function TExComboBox.AddItem(ItemText: String; idKey, idValue: Integer;
txValue: string): Integer;
var Index: Integer;
     ItemData: TItemData;
begin
  Index:= self.Items.Add(ItemText);
  ItemData:= TItemData.Create;
  ItemData.idkey:= idKey;
  ItemData.idValue:= idValue;
  ItemData.txValue:= txValue;
  Items.Objects[Index]:= ItemData;
  Result:= Index;
end;

ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;

Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
objekty ktore sa pri volani metody AddItem vytvorili.

destructor TExComboBox.Destroy;
begin
  for i:= 0 to self.Items.Count - 1 do
     Items.Objects[Index].Free;
  inherited Destroy;
end;

padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"


Odpovedá: Blazek Jaroslav

11. 10. 2002 12:55

Ahoj,

>Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
>pricom som nadefinoval vlastnu metodu
>ktora vytvori novy objekt TItemIdata a priradi ho do vlastnosti Objects;

>Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
>objekty ktore sa pri volani metody AddItem vytvorili.

>destructor TExComboBox.Destroy;
>begin
> for i:= 0 to self.Items.Count - 1 do
> Items.Objects[Index].Free;
> inherited Destroy;
>end;

zkusil jsem si neco podobneho a je vse v poradku
tady je prikladek

http://sweb.cz/data.product/Delphi/5/TExCombo.zip

jen pozor na pouziti ExCombo.Items.Clear();


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Blazek Jaroslav

11. 10. 2002 11:54

Ahoj,

>Potreboval bvy so poradit pisem komponentu ktora je podedena od TComboBox,
>pricom som nadefinoval vlastnu metodu

pardon trochu mi to ujelo

http://sweb.cz/data.product/Delphi/5/TExCombo/TExCombo.zip




S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Petr Vones

12. 10. 2002 20:06

From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
> objekty ktore sa pri volani metody AddItem vytvorili.
> padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
TComboBox uklada data do ovladaciho prvku Windows, takze je nutne aby pri
praci s daty tento prvek existoval. Uvolneni musis provest v reakci na zpravu
WM_DESTROY. Nelze pouzit metodu TWinControl.DestroyWnd protoze ta se vola
pouze v pripade ze dojde k znovuvytvoreni handle pomoci metody RecreateWnd.
Petr Vones

Odpovedá: Lubos Urban

15. 10. 2002 7:15

Problem je v tom, ze ked som to aj robil cez WM_DESTROY tak tento message mi
prisiel aj pri volani RecreateWnd  
Ja sice vo svojom kode komponenty nevolam tuto metodu, ale kedze neviem ako
pracuju komponety zalozene na ovladacich prvkoch Windows, neviem ci mi
predok niekedy nahodou nezavola tuto metodu a tym mi nezrusi pointre na
vsetky tie objekty  

----- Original Message -----
From: "Petr Vones" <pvones@mbox.vol.cz>
To: "Konference Delphi" <delphi-l@clexpert.cz>
Sent: Saturday, October 12, 2002 9:06 PM
Subject: Re: uvolnenie pamati TStrings.objects


> From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> > Problem zacina byt ked sa v destruktore ComboBoxu snazim uvolnit vsetky
> > objekty ktore sa pri volani metody AddItem vytvorili.
> > padne to pri zatvaranii formy s error hlaskou ''CB has no parent window"
>
> TComboBox uklada data do ovladaciho prvku Windows, takze je nutne aby pri
> praci s daty tento prvek existoval. Uvolneni musis provest v reakci na
zpravu
> WM_DESTROY. Nelze pouzit metodu TWinControl.DestroyWnd protoze ta se vola
> pouze v pripade ze dojde k znovuvytvoreni handle pomoci metody
RecreateWnd.
>
> Petr Vones
>
>
>
>

Odpovedá: Petr Vones

15. 10. 2002 13:37

From: "Lubos Urban" <Lubos.Urban@visicom.sk>
> Problem je v tom, ze ked som to aj robil cez WM_DESTROY tak tento message mi
> prisiel aj pri volani RecreateWnd  

To je prece naprosto spravne. Data (TStrings) jsou ulozena v tom ovladacim
prvku a pri RecreateWnd dojde k jeho znovuvytvoreni a jsou tedy ztracena.
Pokud potrebujes aby byly data zachovany tak si je musis v metode DestroyWnd
ulozit do nejakeho docasneho seznamu a v CreateWnd pak z toho seznamu vlozit
zpet do prave nove vytvoreneho ovladaciho prvku. Podivej se do zdrojaku VCL
komponent, tam to najdes.

Petr Vones